home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / quarkpy / mdlentities.py < prev    next >
Text File  |  2004-01-05  |  6KB  |  249 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. Model Editor Entities manager
  4. """
  5. #
  6. # Copyright (C) 1996-99 Armin Rigo
  7. # THIS FILE IS PROTECTED BY THE GNU GENERAL PUBLIC LICENCE
  8. # FOUND IN FILE "COPYING.TXT"
  9. #
  10.  
  11. #$Header: /cvsroot/quark/runtime/quarkpy/mdlentities.py,v 1.7 2001/02/01 22:03:15 aiv Exp $
  12.  
  13.  
  14.  
  15.  
  16. import quarkx
  17. from mdlutils import *
  18. import mdlhandles
  19.  
  20. #
  21. # Classes that implement operations on all types of Model Objects.
  22. # See comments in mapentities.py.
  23. #
  24.  
  25.  
  26. #
  27. # Generic Model object types have type==':m', and are distinguished by a "type" Specific.
  28. # Here is the list of reconized values.
  29. #
  30.  
  31. MT_GROUP       = 0      # generic group
  32. MT_FRAMEGROUP  = 1
  33. MT_SKINGROUP   = 2
  34. MT_SKIN        = 3      # not used
  35. MT_TAGGROUP    = 4      # AiV
  36. MT_BONEGROUP   = 5      # AiV
  37. MT_MISCGROUP   = 6      # AiV
  38.  
  39. #
  40. # Entity Manager base class, followed by subclasses.
  41. #
  42.  
  43. class EntityManager:
  44.     "Base class for entity managers."
  45.  
  46.     #
  47.     # All methods below are here to be overridden in subclasses.
  48.     #
  49.  
  50.     def drawback(o, editor, view, mode):
  51.         "Called to draw a background for the object 'o'."
  52.         view.drawmap(o, mode)  # draw a dark background for "o"
  53. #        pass
  54.  
  55.     def drawsel(o, view, mode):
  56.         "Called to draw the object 'o' selected."
  57. #        view.drawmap(o, DM_SELECTED, YELLOW)  # draw normally by default
  58.         pass
  59.  
  60.     def handles(o, editor, view):
  61.         "Build a list of handles related to this object."
  62.         return []
  63.  
  64.     def handlesopt(o, editor):
  65.         "Optimized view-independant version of 'handles'."
  66.         return []
  67.  
  68.     def applylinear(entity, matrix):
  69.         "Apply a linear mapping on this object."
  70.         pass
  71.  
  72.     def dataformname(o):
  73.         "The name of the data form to use for the Specific/Args page."
  74.         return "Default" + o.type
  75.  
  76.     def menu(o, editor):
  77.         "A pop-up menu related to the object."
  78.         import mdlmenus
  79.         return CallManager("menubegin", o, editor) + mdlmenus.BaseMenu([o], editor)
  80.  
  81.     def menubegin(o, editor):
  82.         return []
  83.  
  84.  
  85.  
  86. class GroupType(EntityManager):
  87.     "Generic Model object type."
  88.  
  89. class MiscGroupType(EntityManager):
  90.     "Misc. Object Group."
  91.  
  92. class FrameGroupType(EntityManager):
  93.     "Model Frame Group."
  94.  
  95. class SkinGroupType(EntityManager):
  96.     "Model Skin Group."
  97.  
  98. def ShowHideComp(x):
  99.     editor = mapeditor()
  100.     if editor is None: return
  101.     obj = editor.layout.explorer.uniquesel
  102.     if obj is None: return
  103.     obj.showhide(x)
  104.     editor.invalidateviews(1)
  105.  
  106. def ShowComp(m):
  107.     ShowHideComp(1)
  108.  
  109. def HideComp(m):
  110.     ShowHideComp(0)
  111.  
  112. class ComponentType(EntityManager):
  113.     "Model Component."
  114.  
  115.     def menu(o, editor):
  116.         import qmenu
  117.         SC1 = qmenu.item("&Show Component", ShowComp)
  118.         HC1 = qmenu.item("&Hide Component", HideComp)
  119.         import mdlmenus
  120.         return CallManager("menubegin", o, editor) + mdlmenus.BaseMenu([o], editor) + [SC1, HC1]
  121.  
  122.  
  123.     def handles(o, editor, view):
  124.         frame = o.currentframe
  125.         if frame is None:
  126.             return []
  127.         else:
  128.             return CallManager("handles", frame, editor, view)
  129.  
  130.     def handlesopt(o, editor):
  131.         frame = o.currentframe
  132.         if frame is None:
  133.             return []
  134.         else:
  135.             return CallManager("handlesopt", frame, editor)
  136.  
  137.  
  138. class FrameType(EntityManager):
  139.     "Model Frame."
  140.  
  141.     def handlesopt(o, editor):
  142.         vtx = o.vertices
  143.         h = map(mdlhandles.VertexHandle, vtx)
  144.         for i in range(len(h)):
  145.             item = h[i]
  146.             item.frame = o
  147.             item.index = i
  148.             item.hint = "Vertex %s"%item.index
  149.         return h
  150.  
  151.  
  152. class SkinType(EntityManager):
  153.     "Model Skin."
  154.  
  155. class TagType(EntityManager):
  156.     "Tag"
  157.  
  158. class BoneType(EntityManager):
  159.     "Bone"
  160.  
  161.     def handlesopt(o, editor):
  162.         start_p = o.start_point
  163.         end_p = o.end_point
  164.         h = []
  165.         if not o["start_point"] is None:
  166.           s = mdlhandles.BoneHandle(start_p)
  167.           s.hint = "Start of %s"%o.shortname
  168.       s.bone = o
  169.       s.s_or_e = 0
  170.       h = h + [ s ]
  171.         e = mdlhandles.BoneHandle(end_p) 
  172.         e.hint = "End of %s"%o.shortname
  173.     e.bone = o
  174.     e.s_or_e = 1
  175.     h = h + [e]
  176.     return h
  177.     
  178. # /AiV
  179.  
  180. #
  181. # Mappings between Internal Objects types and Entity Manager classes.
  182. #
  183.  
  184. Mapping = {
  185.     ":mc": ComponentType(),
  186.     ":mf": FrameType(),
  187.     ".pcx": SkinType(),
  188.     ".jpg": SkinType(),
  189.     ":tag": TagType(),
  190.     ":bone": BoneType() }
  191.  
  192. Generics = [GroupType(), FrameGroupType(), SkinGroupType(), SkinGroupType(), MiscGroupType(), MiscGroupType()]  # AiV
  193.  
  194. #
  195. # Use the function below to call a method of the Entity Manager classes.
  196. # Syntax is : CallManager("method", entity, arguments...)
  197. #
  198.  
  199. def CallManager(fn, *args):
  200.     "Calls a function suitable for the QuArK object given as second argument."
  201.     tag = args[0].type
  202.     try:
  203.         if tag == ':m':
  204.             mgr = Generics[args[0].getint("type")]
  205.         else:
  206.             mgr = Mapping[tag]
  207.     except:
  208.         mgr = EntityManager()    # unknown type
  209.     return apply(getattr(mgr, fn).im_func, args)  # call the function
  210.  
  211.  
  212.  
  213. #
  214. # Function to load the form corresponding to an entity list.
  215. #
  216.  
  217. def LoadEntityForm(sl):
  218.     formobj = None
  219.     if len(sl):
  220.         f1 = CallManager("dataformname", sl[0])
  221.         for obj in sl[1:]:
  222.             f2 = CallManager("dataformname", obj)
  223.             if f2!=f1:
  224.                 f1 = None
  225.                 break
  226.         if f1 is not None:
  227.             flist = quarkx.getqctxlist(':form', f1)
  228.             if len(flist):
  229.                 formobj = flist[-1]
  230.     return formobj
  231.  
  232. # ----------- REVISION HISTORY ------------
  233. #
  234. #
  235. #$Log: mdlentities.py,v $
  236. #Revision 1.7  2001/02/01 22:03:15  aiv
  237. #RemoveVertex Code now in Python
  238. #
  239. #Revision 1.6  2000/10/11 19:07:47  aiv
  240. #Bones, and some kinda skin vertice viewer
  241. #
  242. #Revision 1.5  2000/08/21 21:33:04  aiv
  243. #Misc. Changes / bugfixes
  244. #
  245. #Revision 1.2  2000/06/02 16:00:22  alexander
  246. #added cvs headers
  247. #
  248. #
  249. #